package com.three.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.three.entity.Staff;
import com.three.entity.Stafftransfer;
import com.three.mapper.DepartmentMapper;
import com.three.mapper.StaffMapper;
import com.three.mapper.StafftransferMapper;
import com.three.service.StaffInfoService;
import com.three.vo.R;
import com.three.vo.StaffInfoVo;
import com.three.vo.StafftransferDiaoVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;

@Service
public class StaffInfoServiceImpl implements StaffInfoService {
    @Autowired
    private StaffMapper staffMapper;
    @Autowired
    private DepartmentMapper departmentMapper;
    @Autowired
    private StafftransferMapper stafftransferMapper;
    @Autowired
    private HttpSession session;
    @Override
    public R getStaffInfo(Integer currentPage, Integer pageSize,StaffInfoVo staffInfoVo) {
        //开启分页
        PageHelper.startPage(currentPage,pageSize);
        Staff staff = (Staff) session.getAttribute("staff");
        if (!staff.getBranchid().equals(12138)){
            staffInfoVo.setBranchid(staff.getBranchid());
        }
        List<Staff> staffList = staffMapper.getAllStaff(staffInfoVo);

        PageInfo<Staff> pageInfo = new PageInfo<>(staffList);
        return R.ok(pageInfo);
    }

    @Override
    public R checkStaffid(Integer staffid) {
        Staff staff = staffMapper.checkStaffid(staffid);
        if (staff != null){
            return R.error("员工编号已存在");
        }else {
            return R.ok();
        }
    }

    @Override
    public R checkIdcard(String idcard) {
        Staff staff = staffMapper.checkIdcard(idcard);
        //System.out.println(staff);
        if (staff != null){
            return R.error("身份证号已存在");
        }else {
            return R.ok();
        }
    }

    @Override
    public R checkPhone(String phone) {
        Staff staff = staffMapper.checkPhone(phone);
        if (staff != null){
            return R.error("手机号已存在");
        }else {
            return R.ok();
        }
    }
    //添加员工
    @Override
    public R addStaff(Staff staff) {
        //获取部门id
        int deptid = staff.getDeptid();
        //所在部门人数加一
        int i1 = departmentMapper.addCounts(deptid);
        staff.setState(1);//默认在职
        int i = staffMapper.insertSelective(staff);
        return R.ok();
    }
    //修改员工信息
    @Override
    public R updateStaff(Staff staff) {
        int i = staffMapper.updateByPrimaryKeySelective(staff);
        if (i > 0){
            return R.ok("修改成功");
        }
        return R.error("修改失败");
    }
    //数据回显
    @Override
    public R getStaffById(Integer id) {
        // 通过员工ID查询员工信息
        Staff staff = staffMapper.selectByPrimaryKey(id);
        // 判断查询结果是否为空
        if (staff != null){
            // 如果员工信息存在，返回成功信息和员工数据
            return R.ok(staff);
        }
        // 如果员工信息不存在，返回错误信息
        return R.error("数据不存在");
    }
    //调动提交
    @Override
    /**
     * 处理员工调用申请
     *
     * @param stafftransferDiaoVo 员工调用信息封装对象，包含调用申请的相关信息
     * @return 返回调用申请处理结果
     */
    public R mobilizestaff(StafftransferDiaoVo stafftransferDiaoVo) {
        // 获取员工调用申请中的基本信息
        Integer staffid=stafftransferDiaoVo.getStaffid();
        Integer branchid=stafftransferDiaoVo.getBranchid();
        Integer newbranchname=stafftransferDiaoVo.getNewbranchname();
        Integer deptid=stafftransferDiaoVo.getDeptid();
        Integer newdeptname=stafftransferDiaoVo.getNewdeptname();

        // 从session中获取当前操作员工信息
        Staff staff = (Staff) session.getAttribute("staff");
        Integer applyid=staff.getStaffid();

        // 创建员工调用记录对象并设置相关属性
        Stafftransfer stafftransfer=new Stafftransfer();
        stafftransfer.setStaffid(staffid);
        stafftransfer.setBranchid(branchid);
        stafftransfer.setDeptid(deptid);
        stafftransfer.setNewbranchid(newbranchname);
        stafftransfer.setNewdeptid(newdeptname);
        stafftransfer.setApplyid(applyid);
        stafftransfer.setState(1); // 设置申请状态为待处理
        Date applytime=new Date();
        stafftransfer.setApplytime(applytime);

        // 调用Mapper方法把调动申请记录添加到审核表(stafftransfer)中
        int i = stafftransferMapper.insertPingdiao(stafftransfer);

        // 根据插入结果返回处理状态
        if (i > 0){
            return R.ok();
        }else {
            return R.error();
        }
    }
    //离职
    @Override
    public R lizhi(Integer id) {
        // 根据ID查询员工信息
        Staff staff = staffMapper.selectByPrimaryKey(id);
        Date leaveTime = new Date();//获取当前时间
        staff.setLeavetime(leaveTime);//设置离职时间
        // 检查员工是否存在
        if (staff != null){
            // 设置员工状态为离职（0代表离职）
            staff.setState(0);
            // 更新员工信息，仅更新员工状态
            int i = staffMapper.updateByPrimaryKeySelective(staff);
            // 根据更新结果返回相应的信息
            if (i > 0){
                return R.ok("离职成功");
            }else {
                return R.error("离职失败");
            }
        }
        // 如果员工不存在，返回null
        return null;
    }
    //冻结/解冻
    /**
     * 冻结或解冻指定员工
     * 此方法根据员工当前状态更改员工的冻结状态如果员工当前状态为1（假设1代表活动状态），
     * 则将其状态更改为2（假设2代表冻结状态），反之亦然通过更新数据库中的员工状态来实现冻结或解冻操作
     *
     * @param id 员工ID，用于标识需要进行冻结或解冻操作的员工
     * @return 返回一个R对象，包含操作结果信息如果操作成功，返回成功消息；
     *         如果操作失败，返回错误消息如果ID对应的状态不是预期的1或2，则返回null
     */
    @Override
    public R freeze(Integer id) {
        // 根据ID查询员工信息
        Staff staff = staffMapper.selectByPrimaryKey(id);
        //如果前端传递的参数是1，则冻结，2解冻
        if (staff.getState() == 1){
            // 将员工状态设置为冻结
            staff.setState(2);
            // 更新员工状态
            int i = staffMapper.updateByPrimaryKeySelective(staff);
            // 根据更新结果返回相应消息
            if (i > 0){
                return R.ok("冻结成功");
            }else {
                return R.error("冻结失败");
            }
        }else if(staff.getState() == 2){
            // 将员工状态设置为活动
            staff.setState(1);
            // 更新员工状态
            int i = staffMapper.updateByPrimaryKeySelective(staff);
            // 根据更新结果返回相应消息
            if (i > 0){
                return R.ok("解冻成功");
            }else {
                return R.error("解冻失败");
            }
        }
        // 如果员工状态既不是1也不是2，则返回null
        return null;
    }

    //查询员工审核表该员工的状态
    /**
     * 根据员工ID选择员工调动状态
     * 此方法用于检查特定员工是否有未完成的调动记录
     *
     * @param staffid 员工ID，用于查询特定员工的调动信息
     * @return 返回一个R对象，表示查询结果的状态
     */
    @Override
    public R selectStafftransferState(Integer staffid) {
        // 根据员工ID和分店ID查询员工调动状态
        Stafftransfer aa = stafftransferMapper.selectStafftransferState(staffid);
        // 判断查询结果是否为空
        if (aa == null){
            // 如果查询结果为空，表示没有找到员工的调动记录，返回成功响应
            return R.ok();
        }else {
            // 如果查询结果不为空，表示找到了员工的调动记录，返回错误响应
            return R.error();
        }
    }

}
